/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.analyzer;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import ade.prime.exception.AAAException;
import android.content.Context;
import android.util.Log;


/**
 * Fournisseur de données.
 * @author Zanette Sébastien, @author Andrianjafintrimo Victor
 */
public class ContainerData {
	
	private static final String TAG = ContainerData.class.getSimpleName() ;

	public static Context context ;

	private static String URL_FEED_LESSON = "http://adeweb.uhp-nancy.fr/jsp/webapi?sessionId=%s&function=getEvents&resources=%s&detail=8&startDate=%s&endDate=%s" ;
	private static String URL_FEED_PROJECT = "http://adeweb.uhp-nancy.fr/jsp/webapi?sessionId=%s&function=getProjects&detail=2";
	public static String URL_FEED_RESOURCE = "http://adeweb.uhp-nancy.fr/jsp/webapi?sessionId=%s&function=getResources&code=%s&detail=3" ;
	public static String URL_FEED_CONNEXION = "http://adeweb.uhp-nancy.fr/jsp/webapi?function=connect&login=ade_uhp&password=edt_uhp" ;
	public static String URL_FEED_DECONNEXION ="http://adeweb.uhp-nancy.fr/jsp/webapi?sessionId=%s&function=disconnect";
	public static String URL_FEED_SET_PROJECT = "http://adeweb.uhp-nancy.fr/jsp/webapi?sessionId=%s&function=setProject&projectId=%s" ;

	public ContainerData() {
		super() ;
	}

	public static ArrayList<FeedLesson> getFeedsLesson(String sessionId, String resource, int period){
		SAXParserFactory fabrique = SAXParserFactory.newInstance() ;
		SAXParser parseur = null ;
		ArrayList<FeedLesson> feeds = null ; 
		GregorianCalendar calendar = new java.util.GregorianCalendar(); 
		String start = new SimpleDateFormat("MM/dd/yyyy").format(calendar.getTime());
		calendar.add(Calendar.DATE, period);
		String end = new SimpleDateFormat("MM/dd/yyyy").format(calendar.getTime());
		String urlF = String.format(URL_FEED_LESSON, sessionId, resource, start, end) ;
//		Log.d(TAG, "[getFeedsLesson]: " + urlF) ;

		try {
			parseur = fabrique.newSAXParser() ;
			URL url = new URL(urlF) ;
			/* 
			 * Le handler sera gestionnaire du fichier XML c'est à dire que c'est lui qui sera chargé
			 * des opérations de parsing. On vera cette classe en détails ci aprés.
			 */
			DefaultHandler handler = new ParserLesson();
			// On parse le fichier XML
			parseur.parse(url.openConnection().getInputStream(), handler);
			// On récupére directement la liste des feeds
			feeds = ((ParserLesson) handler).getData();
		} catch (ParserConfigurationException e) {
			//TODO
		} catch (SAXException e) {
			//TODO
		} catch (MalformedURLException e1) {
			//TODO (Highly unlikely error)
		} catch (IOException e) {
			e.printStackTrace();
		}// try

		// On la retourne l'array list
		return feeds;
	}

	public static ArrayList<FeedProject> getFeedsProject(String sessionId){
		SAXParserFactory fabrique = SAXParserFactory.newInstance() ;
		SAXParser parseur = null ;
		ArrayList<FeedProject> feeds = null ;               
		String urlF = String.format(URL_FEED_PROJECT, sessionId) ;

		try {
			parseur = fabrique.newSAXParser() ;
			URL url = new URL(urlF) ;
			/* 
			 * Le handler sera gestionnaire du fichier XML c'est à dire que c'est lui qui sera chargé
			 * des opérations de parsing. On vera cette classe en détails ci aprés.
			 */
			DefaultHandler handler = new ParserProject();
			// On parse le fichier XML
			parseur.parse(url.openConnection().getInputStream(), handler);
			// On récupére directement la liste des feeds
			feeds = ((ParserProject) handler).getData();
			Log.v("Project", ""+feeds);
		} catch (ParserConfigurationException e) {
			//TODO
		} catch (SAXException e) {
			//TODO
		} catch (MalformedURLException e1) {
			//TODO (Highly unlikely error)
		} catch (IOException e) {
			e.printStackTrace();
		}// try

		// On la retourne l'array list
		return feeds;
	}

	public static ArrayList<FeedResourceEtud> getFeedsResources(String sessionId, String numEtudiant){
		SAXParserFactory fabrique = SAXParserFactory.newInstance() ;
		SAXParser parseur = null ;
		ArrayList<FeedResourceEtud> feeds = null ;               
		String urlF = String.format(URL_FEED_RESOURCE, sessionId, numEtudiant) ;
		try {
			parseur = fabrique.newSAXParser() ;
			URL url = new URL(urlF) ;
			/* 
			 * Le handler sera gestionnaire du fichier XML c'est à dire que c'est lui qui sera chargé
			 * des opérations de parsing. On vera cette classe en détails ci aprés.
			 */
			DefaultHandler handler = new ParserResourceEtud();
			// On parse le fichier XML
			parseur.parse(url.openConnection().getInputStream(), handler);
			// On récupére directement la liste des feeds
			feeds = ((ParserResourceEtud) handler).getData();
			Log.v("ResourceEtud", ""+feeds);
		} catch (ParserConfigurationException e) {
			//TODO
		} catch (SAXException e) {
			//TODO
		} catch (MalformedURLException e1) {
			//TODO (Highly unlikely error)
		} catch (IOException e) {
			e.printStackTrace();
		}// try

		// On la retourne l'array list
		return feeds;
	}

	public static FeedConnection getFeedConnexion() throws AAAException {
		SAXParserFactory fabrique = SAXParserFactory.newInstance() ;
		SAXParser parseur = null ;
		FeedConnection feed = null ;               
		String urlF = String.format(URL_FEED_CONNEXION) ;
		try {
			parseur = fabrique.newSAXParser() ;
			URL url = new URL(urlF) ;
			/* 
			 * Le handler sera gestionnaire du fichier XML c'est à dire que c'est lui 
			 * qui sera chargé des opérations de parsing. On vera cette classe en 
			 * détails ci aprés.
			 */
			DefaultHandler handler = new ParserConnexion();
			// On parse le fichier XML
			parseur.parse(url.openConnection().getInputStream(), handler);
			// On récupére directement la liste des feeds
			feed = ((ParserConnexion) handler).getData();
			Log.v("Connexion", ""+feed);
		} catch (ParserConfigurationException e) {
			//TODO
		} catch (SAXException se) {
			//TODO
		} catch (MalformedURLException e1) {
			//TODO (Highly unlikely error)
		} catch (IOException ioe) {
			ioe.printStackTrace() ;
			throw new AAAException("Unknown host. (ADE is unreachable)") ;
		}// try

		// On la retourne le feed connexion
		return feed;
	}

	public static FeedConnection getFeedDeconnexion(String sessionId){
		SAXParserFactory fabrique = SAXParserFactory.newInstance() ;
		SAXParser parseur = null ;
		FeedConnection feed = null ;               
		String urlF = String.format(URL_FEED_DECONNEXION,sessionId) ;
		try {
			parseur = fabrique.newSAXParser() ;
			URL url = new URL(urlF) ;
			/* 
			 * Le handler sera gestionnaire du fichier XML c'est à dire que c'est lui qui sera chargé
			 * des opérations de parsing. On vera cette classe en détails ci aprés.
			 */
			DefaultHandler handler = new ParserConnexion();
			// On parse le fichier XML
			parseur.parse(url.openConnection().getInputStream(), handler);
			// On récupére directement la liste des feeds
			feed = ((ParserConnexion) handler).getData();
			Log.v("Deconnexion", ""+feed);
		} catch (ParserConfigurationException e) {
			//TODO
		} catch (SAXException e) {
			//TODO
		} catch (MalformedURLException e1) {
			//TODO (Highly unlikely error)
		} catch (IOException e) {
			e.printStackTrace();
		}// try

		// On la retourne le feed connexion
		return feed;
	}

	public static FeedConnection getFeedSetProject(String sessionId, int projectId){
		SAXParserFactory fabrique = SAXParserFactory.newInstance() ;
		SAXParser parseur = null ;
		FeedConnection feed = null ;               
		String urlF = String.format(URL_FEED_SET_PROJECT,sessionId,projectId) ;
		try {
			parseur = fabrique.newSAXParser() ;
			URL url = new URL(urlF) ;
			/* 
			 * Le handler sera gestionnaire du fichier XML c'est à dire que c'est lui qui sera chargé
			 * des opérations de parsing. On vera cette classe en détails ci aprés.
			 */
			DefaultHandler handler = new ParserConnexion();
			// On parse le fichier XML
			parseur.parse(url.openConnection().getInputStream(), handler);
			// On récupére directement la liste des feeds
			feed = ((ParserConnexion) handler).getData();
			Log.v("SetProject", ""+feed);
		} catch (ParserConfigurationException e) {
			//TODO
		} catch (SAXException e) {
			//TODO
		} catch (MalformedURLException e1) {
			//TODO (Highly unlikely error)
		} catch (IOException e) {
			e.printStackTrace();
		}// try

		// On la retourne le feed connexion
		return feed;
	}

}